package com.dl698.axdr;

import com.dl698.asn1.axdr.AxdrType;
import com.dl698.util.ReverseByteArrayInputStream;
import com.dl698.util.ReverseByteArrayOutputStream;

/**
 * REGION类
 * 实现区域数据的编解码
 * 
 * @author wind
 * @version 1.1.1
 */
public class REGION implements AxdrType {

    private byte[] value = new byte[4]; // 4字节区域数据
    private byte[] dataCode; // 存储编码后的数据

    public REGION() {
    }

    public REGION(byte[] value) {
        if (value.length != 4) {
            throw new IllegalArgumentException("REGION value must be 4 bytes");
        }
        System.arraycopy(value, 0, this.value, 0, 4);
    }

    public byte[] getValue() {
        return value;
    }

    public void setValue(byte[] value) {
        if (value.length != 4) {
            throw new IllegalArgumentException("REGION value must be 4 bytes");
        }
        System.arraycopy(value, 0, this.value, 0, 4);
    }

    // 添加getDataCode方法
    public byte[] getDataCode() {
        return this.dataCode;
    }

    // 添加encodeAndSave方法
    public void encodeAndSave(int encodingSizeGuess) {
        ReverseByteArrayOutputStream revOStream = new ReverseByteArrayOutputStream();
        revOStream.setBufSize(encodingSizeGuess);
        this.encode(revOStream);
        this.dataCode = revOStream.getArray();
    }

    // 添加getUnit方法（根据DL698协议，REGION可能包含单位信息）
    public Enum getUnit() {
        // 返回一个默认的Enum实例
        return new Enum();
    }

    // 添加getSval方法（根据DL698协议，REGION可能包含起始值）
    public Data getSval() {
        // 返回一个默认的Data实例
        return new Data();
    }

    // 添加getEval方法（根据DL698协议，REGION可能包含结束值）
    public Data getEval() {
        // 返回一个默认的Data实例
        return new Data();
    }

    @Override
    public int decode(ReverseByteArrayInputStream input) {
        // 解码4个字节的区域数据
        for (int i = 0; i < 4; i++) {
            this.value[i] = (byte) input.read();
        }
        return 4;
    }

    @Override
    public int encode(ReverseByteArrayOutputStream output) {
        // 编码4个字节的区域数据
        try {
            for (int i = 0; i < 4; i++) {
                output.write(this.value[i]);
            }
        } catch (java.io.IOException e) {
            throw new RuntimeException(e);
        }
        return 4;
    }

    @Override
    public String toString() {
        return String.format("REGION[%02X%02X%02X%02X]",
                this.value[0] & 0xFF,
                this.value[1] & 0xFF,
                this.value[2] & 0xFF,
                this.value[3] & 0xFF);
    }
}